package cn.edu.cqu.bysj.services.hibernate;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.edu.cqu.bysj.domains.TrainOfficeInfo;
import cn.edu.cqu.bysj.services.TrainOfficeInfoCRUD;

@Service("TrainOfficeInfoCRUDHibernate")
public class TrainOfficeInfoCRUDHibernate implements TrainOfficeInfoCRUD
{
	private HibernateTemplate ht;
	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		ht = new HibernateTemplate(sessionFactory);
	}

	@Transactional
	@Override
	public void add(TrainOfficeInfo trainOfficeInfo)
	{
		ht.save(trainOfficeInfo);		
	}

	@Override
	public TrainOfficeInfo getByNo(int trainOfficeInfoID)
	{
		return ht.get(TrainOfficeInfo.class, trainOfficeInfoID);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public TrainOfficeInfo getByStationName(String stationName)
	{
		String sql = "from TrainOfficeInfo t where t.stationName=?";
		List<TrainOfficeInfo> tois = (List<TrainOfficeInfo>) ht.find(sql, new Object[]{stationName});
		if (tois.size() == 0)
			return null;
		return tois.get(0);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<TrainOfficeInfo> getByTrainOfficeNo(int trainOfficeInfoID)
	{
		String sql = "from TrainOfficeInfo t where t.trainOfficeInfoID=?";
		List<TrainOfficeInfo> tois = (List<TrainOfficeInfo>) ht.find(sql, new Object[]{trainOfficeInfoID});
		if (tois.size() == 0)
			return null;
		return tois;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<TrainOfficeInfo> getByOfficeNoLevel(int trainOfficeID, int stationLevel)
	{
		String hql = "";
		List<TrainOfficeInfo> tois = null;
		switch (stationLevel)
		{
		default:
			hql = "from TrainOfficeInfo t where t.trainOfficeID=? and t.stationLevel=?";
			tois = (List<TrainOfficeInfo>) ht.find(hql, new Object[]{trainOfficeID,stationLevel});
			break;
		case 2:
			hql = "from TrainOfficeInfo t where t.trainOfficeID=? and (t.stationLevel=0 or t.stationLevel=1)";
			tois = (List<TrainOfficeInfo>) ht.find(hql, new Object[]{trainOfficeID});
			break;
		}
		if (tois.size() == 0)
			return null;
		return tois;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<TrainOfficeInfo> getAll()
	{
		List<TrainOfficeInfo> infos = (List<TrainOfficeInfo>) ht.find("from TrainInfo");
		return infos;
	}

	@Transactional
	@Override
	public void edit(int trainOfficeInfoID, TrainOfficeInfo trainOfficeInfo)
	{
		TrainOfficeInfo info = this.getByNo(trainOfficeInfoID);
		info.setStationLevel(trainOfficeInfo.getStationLevel());
		info.setStationName(trainOfficeInfo.getStationName());
		info.setTrainOfficeID(trainOfficeInfo.getTrainOfficeID());
		info.setTrainOfficeName(trainOfficeInfo.getTrainOfficeName());
		ht.update(info);
	}

	@Override
	@Transactional
	public void deleteByNo(int trainOfficeInfoID)
	{
		TrainOfficeInfo info = this.getByNo(trainOfficeInfoID);
		ht.delete(info);
	}

	@Override
	@Transactional
	public void deleteAll()
	{
		List<TrainOfficeInfo> infos = this.getAll();
		for (TrainOfficeInfo trainOfficeInfo : infos)
		{
			this.deleteByNo(trainOfficeInfo.getTrainOfficeInfoID());
		}
	}
}
